﻿using System.Linq.Expressions;

namespace MathService.MathParser.ExpressionTrees.Nodes
{
    public abstract class LogicOperatorNode : OperatorNode
    {
        protected LogicOperatorNode(string Name, int Priority) : base(Name, Priority) { }

        /// <summary>Компиляция логики узла</summary>
        /// <returns>Скомпилированное логическое выражение, реализующее логику оператора</returns>
        public abstract Expression LogicCompile();

        /// <summary>Компиляция логики узла</summary>
        /// <param name="Parameters">Параметры компиляции</param>
        /// <returns>Скомпилированное логическое выражение, реализующее логику оператора</returns>
        public abstract Expression LogicCompile(ParameterExpression[] Parameters);

        /// <summary>Компиляция узла</summary>
        /// <returns>Скомпилированное выражение произведения узлов поддеревьев</returns>
        public override Expression Compile()
        {
            return Expression.Condition(LogicCompile(), Expression.Constant(1.0), Expression.Constant(0.0));
        }

        /// <summary>Компиляция узла</summary>
        /// <param name="Parameters">Массив параметров выражения</param>
        /// <returns>Скомпилированное выражение произведения узлов поддеревьев</returns>
        public override Expression Compile(ParameterExpression[] Parameters)
        {
            return Expression.Condition(LogicCompile(Parameters), Expression.Constant(1.0), Expression.Constant(0.0));
        }
    }
}